# coding: utf-8
"""
菜单服务类，负责处理菜单相关的业务逻辑
"""
from app.models.menu_table import SjmlMenu, SjmlMenuTable, SjmuMenuSql

class MenuService:
    """菜单管理服务类，负责处理菜单相关的业务逻辑"""
    
    @classmethod
    def get_menu_tree_by_record_id(cls, record_id):
        """
        根据record_id获取菜单树状结构
        
        Args:
            record_id: 记录ID
            
        Returns:
            dict: 包含菜单树状结构的字典
        """
        try:
            # 调用model层的方法获取菜单树状结构
            menu_tree = SjmlMenu.get_menu_tree_by_record_id(record_id)
            
            # 构造返回结果
            result = {
                'menu_tree': menu_tree,
                'total_count': len(menu_tree)  # 根菜单数量
            }
            
            return result
        except Exception as e:
            # 记录异常日志
            print(f'【获取菜单树状结构业务逻辑错误:】{str(e)}')
            raise e
    
    @classmethod
    def process_null_values(cls, data):
        """
        处理数据中的null值，确保API返回的数据中不包含None值
        
        Args:
            data: 需要处理的数据
            
        Returns:
            dict: 处理后的数据集
        """
        return {
            'menu_tree': data.get('menu_tree') if data.get('menu_tree') is not None else [],
            'total_count': data.get('total_count') if data.get('total_count') is not None else 0
        }
        
    @classmethod
    def get_menu_data_by_menu_id(cls, menu_id):
        """
        根据menu_id获取菜单下的表数据和SQL数据
        
        Args:
            menu_id: 菜单ID
            
        Returns:
            dict: 包含表数据和SQL数据的字典
        """
        try:
            # 调用model层的方法获取菜单下的表数据
            menu_tables = SjmlMenuTable.get_by_menu_id(menu_id)
            
            # 调用model层的方法获取菜单下的SQL数据
            menu_sqls = SjmuMenuSql.get_by_menu_id(menu_id)
            
            # 转换为字典格式
            table_data = [table.to_dict() for table in menu_tables]
            sql_data = [sql.to_dict() for sql in menu_sqls]
            
            # 将SQL数据按照table_id归类到对应的表数据中
            # 1. 为每个表数据添加sqls字段
            for table in table_data:
                table['sqls'] = []
                
            # 2. 创建表ID到表数据的映射
            table_map = {table['id']: table for table in table_data}
            
            # 3. 将SQL数据归类到对应的表数据中
            for sql in sql_data:
                table_id = sql.get('table_id')
                if table_id and table_id in table_map:
                    # 添加到对应表的sqls列表中
                    table_map[table_id]['sqls'].append(sql)
                else:
                    # 对于没有table_id或table_id不存在的SQL，可以选择：
                    # a. 忽略这些SQL
                    # b. 添加到一个特殊的"未分类"表中
                    # 这里选择忽略这些SQL，因为它们没有明确的归属
                    pass
            
            # 构造返回结果
            result = {
                'table_data': table_data,
                'table_count': len(table_data),
                'sql_count': len(sql_data)
            }
            
            return result
        except Exception as e:
            # 记录异常日志
            print(f'【根据menu_id获取菜单数据业务逻辑错误:】{str(e)}')
            raise e